package fr.cpe.j2ee.projet.war;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.primefaces.event.RowEditEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

import fr.cpe.j2ee.projet.ejb.EmployeeSession;
import fr.cpe.j2ee.projet.ejb.ProjectSession;
import fr.cpe.j2ee.projet.model.Activity;
import fr.cpe.j2ee.projet.model.Employee;
import fr.cpe.j2ee.projet.model.Project;

public class ProjectListBean {
	private TreeNode root;
	private TreeNode selectedNode;
	private List<Project> projectList;
	private List<Activity> activityList;


	private LoginBean loginBean;
	private ProjectAdditionBean additionBean;
	private Employee projectManager;
	
	
	public ProjectAdditionBean getAdditionBean() {
		return additionBean;
	}

	public void setAdditionBean(ProjectAdditionBean additionBean) {
		this.additionBean = additionBean;
	}

	@EJB
	private ProjectSession projectSession;
	
	@EJB
	private EmployeeSession employeeSession;
    
	/**
	 * Constructeur du bean ProjectListBean
	 */
	public ProjectListBean() {  
		// Définition du TreeNode racine, sur lequel seront ajoutés tous les différents projets pour affichage
		root = new DefaultTreeNode("root", null); 

		// Liste des projets à afficher
        projectList = new ArrayList<Project>(); 
    }
	
	@PostConstruct
	public void postContruct() {
		// Récupération de l'employé connecté pour récupération de la liste des projets qu'il manage
		this.projectManager = employeeSession.getById(loginBean.getEmployee().getEmpId()); 
        this.projectList.addAll(this.projectManager.getProjects());
		
        // Récupération de la liste des activités auxquelles l'employé connecté est lié
        this.activityList = new ArrayList<Activity>(this.projectManager.getActivities());
        
        // Appel à la méthode de récupération de la liste des projets inhérents à l'employé de la session
        populateProjectListForTest();  
        additionBean = new ProjectAdditionBean();
        
        try {
			this.finalize();
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Méthode d'ajout d'un nouveau projet lorsque le formulaire de création a été rempli
	 * @param projectAdded
	 */
	public void addProject()
    {
    	// Ajout du projet associé à l'employé en cours en base de données
    	projectSession.create(additionBean.getProName(), additionBean.getProDescription(), additionBean.getProBudget(), this.projectManager);
    	FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Projet ajouté"));
    	FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
    	try {
    		ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
    		context.redirect(context.getRequestContextPath() + "/xhtml/user/userProject.xhtml");
		} catch (IOException e) {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("La redirection a échoué !"));	
			e.printStackTrace();
		}    	
    }
	
	/**
	 * Méthode qui va "peupler" la liste des projets gérés par l'employé connecté sur le site, via un 
	 * appel à la classe métier qui interroge la base de données
	 */
    private void populateProjectListForTest() {   
        /********************************************************************************************
         * Boucle de remplissage de la table Primefaces, à modifier pour lister les éléments 
         * récupéré par la méthode ci-dessus
         *******************************************************************************************/
		for(Project pro: this.projectList)  
		{
        	@SuppressWarnings("unused")
			TreeNode documents = new DefaultTreeNode(pro, root); 
		}
    } 
    
	public List<Activity> getActivityList() {
		return activityList;
	}
    
    public void onEdit(RowEditEvent event) {  
        FacesMessage msg = new FacesMessage("Project Edited", ((Project) event.getObject()).getProName());  
    	FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
      
    public void onCancel(RowEditEvent event) {  
        FacesMessage msg = new FacesMessage("Edition Cancelled", ((Project) event.getObject()).getProName());  
    	FacesContext.getCurrentInstance().addMessage(null, msg);  
    } 
	
	public List<Project> getProjectList() {
		return projectList;
	}

	public void setProjectList(List<Project> projectList) {
		this.projectList = projectList;
	}
	
	public TreeNode getRoot() {  
        return root;  
    }

	public TreeNode getSelectedNode() {
		return selectedNode;
	}

	public void setSelectedNode(TreeNode selectedNode) {
		this.selectedNode = selectedNode;
	}  
	
	public void setLoginBean(LoginBean loginBean) {
		this.loginBean = loginBean;
	}
}